home *** CD-ROM | disk | FTP | other *** search
/ Euroscene 2 / Euroscene 2.iso / USEFUL / DeliTracker130 / Developer / Developer.run / Examples / JamCracker.s < prev    next >
Encoding:
Text File  |  1992-09-23  |  12.9 KB  |  672 lines

  1.  
  2.     incdir    "Includes:"
  3.     include    "misc/DeliPlayer.i"
  4.  
  5. ;
  6. ;
  7.     SECTION Player,Code
  8. ;
  9. ;
  10.  
  11.     PLAYERHEADER PlayerTagArray
  12.  
  13.     dc.b '$VER: JamCracker player module V1.8 (03 Sep 92)',0
  14.     even
  15.  
  16. PlayerTagArray
  17.     dc.l    DTP_PlayerVersion,3
  18.     dc.l    DTP_PlayerName,PName
  19.     dc.l    DTP_Creator,CName
  20.     dc.l    DTP_Check2,Chk
  21.     dc.l    DTP_Interrupt,Int
  22.     dc.l    DTP_InitPlayer,InitPlay
  23.     dc.l    DTP_EndPlayer,EndPlay
  24.     dc.l    DTP_InitSound,InitSnd
  25.     dc.l    DTP_EndSound,RemSnd
  26.     dc.l    DTP_Volume,SetVol
  27.     dc.l    DTP_Balance,SetVol
  28.     dc.l    TAG_DONE
  29.  
  30. *-----------------------------------------------------------------------*
  31. ;
  32. ; Player/Creatorname und lokale Daten
  33.  
  34. PName    dc.b 'JamCracker',0
  35. CName    dc.b 'M. Gemmel,',10
  36.     dc.b 'adapted by Delirium',0
  37.     even
  38.  
  39. pp_data        dc.l 0
  40. pp_songend    dc.l 0
  41. pp_SndLVol    dc.w 0
  42. pp_SndRVol    dc.w 0
  43.  
  44. *-----------------------------------------------------------------------*
  45. ;
  46. ;Interrupt für Replay
  47.  
  48. Int
  49.     movem.l    d0-d7/a0-a6,-(sp)
  50.     jsr    pp_play                ; DudelDiDum
  51.     movem.l    (sp)+,d0-d7/a0-a6
  52.     rts
  53.  
  54. *-----------------------------------------------------------------------*
  55. ;
  56. ; Testet auf Modul
  57.  
  58. Chk
  59.     move.l    dtg_ChkData(a5),a0
  60.     move.l    (a0),d0
  61.     subi.l    #"BeEp",d0
  62.     rts
  63.  
  64. *-----------------------------------------------------------------------*
  65. ;
  66. ; Init Player
  67.  
  68. InitPlay
  69.     moveq    #0,d0
  70.     move.l    dtg_GetListData(a5),a0        ; Function
  71.     jsr    (a0)
  72.     move.l    a0,pp_data
  73.  
  74.     move.l    dtg_SongEnd(a5),pp_songend    ; store Songend FunctionPtr
  75.  
  76.     move.l    dtg_AudioAlloc(a5),a0        ; Function
  77.     jsr    (a0)                ; returncode is already set !
  78.     rts
  79.  
  80. *-----------------------------------------------------------------------*
  81. ;
  82. ; End Player
  83.  
  84. EndPlay
  85.     move.l    dtg_AudioFree(a5),a0        ; Function
  86.     jsr    (a0)
  87.     rts
  88.  
  89. *-----------------------------------------------------------------------*
  90. ;
  91. ; Init Sound
  92.  
  93. InitSnd
  94.     jsr    pp_init                ; Init Sound
  95.     rts
  96.  
  97. *-----------------------------------------------------------------------*
  98. ;
  99. ; Remove Sound
  100.  
  101. RemSnd
  102.     jsr    pp_end                ; End Sound
  103.     rts
  104.  
  105. *-----------------------------------------------------------------------*
  106. ;
  107. ; Copy Volume and Balance Data to internal buffer
  108.  
  109. SetVol
  110.     move.w    dtg_SndLBal(a5),d0
  111.     mulu    dtg_SndVol(a5),d0
  112.     lsr.w    #6,d0
  113.     move.w    d0,pp_SndLVol            ; Left Volume
  114.  
  115.     move.w    dtg_SndRBal(a5),d0
  116.     mulu    dtg_SndVol(a5),d0
  117.     lsr.w    #6,d0
  118.     move.w    d0,pp_SndRVol            ; Right Volume
  119.     rts
  120.  
  121. *-----------------------------------------------------------------------*
  122. ;
  123. ; JamCracker-Replay
  124.  
  125.                   ****************************************
  126.                   *** JamCrackerPro V1.0a play-routine ***
  127.                   ***   Originally coded by M. Gemmel  ***
  128.                   ***           Code optimised         ***
  129.                   ***         by Xag of Betrayal       ***
  130.                   ***    See docs for important info   ***
  131.                   ****************************************
  132.  
  133.  
  134. DMAWAIT        EQU    $12C    ;Change to suit
  135.  
  136.     *** Relative offset definitions ***
  137.  
  138.         RSRESET        ;Instrument info structure
  139. it_name        RS.B    31
  140. it_flags    RS.B    1
  141. it_size        RS.L    1
  142. it_address    RS.L    1
  143. it_sizeof    RS.W    0
  144.  
  145.         RSRESET        ;Pattern info structure
  146. pt_size        RS.W    1
  147. pt_address    RS.L    1
  148. pt_sizeof    RS.W    0
  149.  
  150.         RSRESET        ;Note info structure
  151. nt_period    RS.B    1
  152. nt_instr    RS.B    1
  153. nt_speed    RS.B    1
  154. nt_arpeggio    RS.B    1
  155. nt_vibrato    RS.B    1
  156. nt_phase    RS.B    1
  157. nt_volume    RS.B    1
  158. nt_porta    RS.B    1
  159. nt_sizeof    RS.W    0
  160.  
  161.         RSRESET        ;Voice info structure
  162. pv_waveoffset    RS.W    1
  163. pv_dmacon    RS.W    1
  164. pv_custbase    RS.L    1
  165. pv_inslen    RS.W    1
  166. pv_insaddress    RS.L    1
  167. pv_peraddress    RS.L    1
  168. pv_pers        RS.W    3
  169. pv_por        RS.W    1
  170. pv_deltapor    RS.W    1
  171. pv_porlevel    RS.W    1
  172. pv_vib        RS.W    1
  173. pv_deltavib    RS.W    1
  174. pv_vol        RS.W    1
  175. pv_deltavol    RS.W    1
  176. pv_vollevel    RS.W    1
  177. pv_phase    RS.W    1
  178. pv_deltaphase    RS.W    1
  179. pv_vibcnt    RS.B    1
  180. pv_vibmax    RS.B    1
  181. pv_flags    RS.B    1
  182. pv_sizeof    RS.W    0
  183.  
  184.  
  185.         SECTION    BTLCRACKER_PLAYER,CODE
  186.  
  187.     *** Initialise routine ***
  188.  
  189. pp_init:    move.l    pp_data,a0
  190.         addq.w    #4,a0
  191.         move.w    (a0)+,d0
  192.         move.w    d0,d1
  193.         move.l    a0,instable
  194.         mulu    #it_sizeof,d0
  195.         add.w    d0,a0
  196.  
  197.         move.w    (a0)+,d0
  198.         move.w    d0,d2
  199.         move.l    a0,patttable
  200.         mulu    #pt_sizeof,d0
  201.         add.w    d0,a0
  202.  
  203.         move.w    (a0)+,d0
  204.         move.w    d0,songlen
  205.         move.l    a0,songtable
  206.         add.w    d0,d0
  207.         add.w    d0,a0
  208.  
  209.         move.l    patttable(PC),a1
  210.         move.w    d2,d0
  211.         subq.w    #1,d0
  212. .l0:        move.l    a0,pt_address(a1)
  213.         move.w    (a1),d3        ;pt_size
  214.         mulu    #nt_sizeof*4,d3
  215.         add.w    d3,a0
  216.         addq.w    #pt_sizeof,a1
  217.         dbra    d0,.l0
  218.  
  219.         move.l    instable(PC),a1
  220.         move.w    d1,d0
  221.         subq.w    #1,d0
  222. .l1:        move.l    a0,it_address(a1)
  223.         move.l    it_size(a1),d2
  224.         add.l    d2,a0
  225.         add.w    #it_sizeof,a1
  226.         dbra    d0,.l1
  227.  
  228.         move.l    songtable(PC),pp_songptr
  229.         move.w    songlen(PC),pp_songcnt
  230.         move.l    pp_songptr(PC),a0
  231.         move.w    (a0),d0
  232.         mulu    #pt_sizeof,d0
  233.         add.l    patttable(PC),d0
  234.         move.l    d0,a0
  235.         move.l    a0,pp_pattentry
  236.         move.b    pt_size+1(a0),pp_notecnt
  237.         move.l    pt_address(a0),pp_address
  238.         move.b    #6,pp_wait
  239.         move.b    #1,pp_waitcnt
  240.         clr.l    pp_nullwave
  241.         move.w    #$000F,$DFF096
  242.  
  243.         lea    pp_variables(PC),a0
  244.         lea    $DFF0A0,a1
  245.         moveq    #1,d1
  246.         move.w    #$80,d2
  247.         moveq    #4-1,d0
  248. .l2:        move.w    #0,8(a1)
  249.         move.w    d2,(a0)        ;pv_waveoffset
  250.         move.w    d1,pv_dmacon(a0)
  251.         move.l    a1,pv_custbase(a0)
  252.         move.l    #pp_periods,pv_peraddress(a0)
  253.         move.w    #1019,pv_pers(a0)
  254.         clr.w    pv_pers+2(a0)
  255.         clr.w    pv_pers+4(a0)
  256.         clr.l    pv_por(a0)
  257.         clr.w    pv_porlevel(a0)
  258.         clr.l    pv_vib(a0)
  259.         clr.l    pv_vol(a0)
  260.         move.w    #$40,pv_vollevel(a0)
  261.         clr.l    pv_phase(a0)
  262.         clr.w    pv_vibcnt(a0)
  263.         clr.b    pv_flags(a0)
  264.         add.w    #pv_sizeof,a0
  265.         add.w    #$10,a1
  266.         add.w    d1,d1
  267.         add.w    #$40,d2
  268.         dbra    d0,.l2
  269. ;        bset    #1,$BFE001
  270.         rts
  271.  
  272.     *** Clean-up routine ***
  273.  
  274. pp_end:        moveq    #0,d0
  275.         lea    $DFF000,a0
  276.         move.w    d0,$A8(a0)
  277.         move.w    d0,$B8(a0)
  278.         move.w    d0,$C8(a0)
  279.         move.w    d0,$D8(a0)
  280.         move.w    #$000F,$96(a0)
  281. ;        bclr    #1,$BFE001
  282.         rts
  283.  
  284.     *** Play routine ***
  285.  
  286. pp_play:    lea    $DFF000,a6
  287.         subq.b    #1,pp_waitcnt
  288.         bne.s    .l0
  289.         bsr    pp_nwnt
  290.         move.b    pp_wait(PC),pp_waitcnt
  291.  
  292. .l0:        lea    pp_variables(PC),a1
  293.         move.w    pp_SndLVol,d1        ; added by Delirium
  294.         bsr.s    pp_uvs
  295.         lea    pp_variables+pv_sizeof(PC),a1
  296.         move.w    pp_SndRVol,d1        ; added by Delirium
  297.         bsr.s    pp_uvs
  298.         lea    pp_variables+2*pv_sizeof(PC),a1
  299.         move.w    pp_SndRVol,d1        ; added by Delirium
  300.         bsr.s    pp_uvs
  301.         lea    pp_variables+3*pv_sizeof(PC),a1
  302.         move.w    pp_SndLVol,d1        ; added by Delirium
  303.  
  304. pp_uvs:        move.l    pv_custbase(a1),a0
  305.  
  306. .l0:        move.w    pv_pers(a1),d0
  307.         bne.s    .l1
  308.         bsr    pp_rot
  309.         bra.s    .l0
  310. .l1:        add.w    pv_por(a1),d0
  311.         tst.w    pv_por(a1)
  312.         beq.s    .l1c
  313.         bpl.s    .l1a
  314.         cmp.w    pv_porlevel(a1),d0
  315.         bge.s    .l1c
  316.         bra.s    .l1b
  317. .l1a:        cmp.w    pv_porlevel(a1),d0
  318.         ble.s    .l1c
  319. .l1b:        move.w    pv_porlevel(a1),d0
  320.  
  321. .l1c:        add.w    pv_vib(a1),d0
  322.         cmp.w    #135,d0
  323.         bge.s    .l1d
  324.         move.w    #135,d0
  325.         bra.s    .l1e
  326. .l1d:        cmp.w    #1019,d0
  327.         ble.s    .l1e
  328.         move.w    #1019,d0
  329. .l1e:        move.w    d0,6(a0)
  330.         bsr    pp_rot
  331.  
  332.         move.w    pv_deltapor(a1),d0
  333.         add.w    d0,pv_por(a1)
  334.         cmp.w    #-1019,pv_por(a1)
  335.         bge.s    .l3
  336.         move.w    #-1019,pv_por(a1)
  337.         bra.s    .l5
  338. .l3:        cmp.w    #1019,pv_por(a1)
  339.         ble.s    .l5
  340.         move.w    #1019,pv_por(a1)
  341.  
  342. .l5:        tst.b    pv_vibcnt(a1)
  343.         beq.s    .l7
  344.         move.w    pv_deltavib(a1),d0
  345.         add.w    d0,pv_vib(a1)
  346.         subq.b    #1,pv_vibcnt(a1)
  347.         bne.s    .l7
  348.         neg.w    pv_deltavib(a1)
  349.         move.b    pv_vibmax(a1),pv_vibcnt(a1)
  350.  
  351. .l7:        move.w    pv_dmacon(a1),d0
  352.         mulu    pv_vol(a1),d1        ; added by Delirium
  353.         lsr.w    #6,d1            ;
  354.         move.w    d1,8(a0)        ;
  355.         move.w    pv_deltavol(a1),d0
  356.         add.w    d0,pv_vol(a1)
  357.         tst.w    pv_vol(a1)
  358.         bpl.s    .l8
  359.         clr.w    pv_vol(a1)
  360.         bra.s    .la
  361. .l8:        cmp.w    #$40,pv_vol(a1)
  362.         ble.s    .la
  363.         move.w    #$40,pv_vol(a1)
  364.  
  365. .la:        btst    #1,pv_flags(a1)
  366.         beq.s    .l10
  367.         tst.w    pv_deltaphase(a1)
  368.         beq.s    .l10
  369.         bpl.s    .sk
  370.         clr.w    pv_deltaphase(a1)
  371. .sk:        move.l    pv_insaddress(a1),a0
  372.         move.w    (a1),d0        ;pv_waveoffset
  373.         neg.w    d0
  374.         lea    (a0,d0.w),a2
  375.         move.l    a2,a3
  376.         move.w    pv_phase(a1),d0
  377.         lsr.w    #2,d0
  378.         add.w    d0,a3
  379.  
  380.         moveq    #$40-1,d0
  381. .lb:        move.b    (a2)+,d1
  382.         ext.w    d1
  383.         move.b    (a3)+,d2
  384.         ext.w    d2
  385.         add.w    d1,d2
  386.         asr.w    #1,d2
  387.         move.b    d2,(a0)+
  388.         dbra    d0,.lb
  389.  
  390.         move.w    pv_deltaphase(a1),d0
  391.         add.w    d0,pv_phase(a1)
  392.         cmp.w    #$100,pv_phase(a1)
  393.         blt.s    .l10
  394.         sub.w    #$100,pv_phase(a1)
  395.  
  396. .l10:        rts
  397.  
  398. pp_rot:        move.w    pv_pers(a1),d0
  399.         move.w    pv_pers+2(a1),pv_pers(a1)
  400.         move.w    pv_pers+4(a1),pv_pers+2(a1)
  401.         move.w    d0,pv_pers+4(a1)
  402.         rts
  403.  
  404. pp_nwnt:    move.l    pp_address(PC),a0
  405.         add.l    #4*nt_sizeof,pp_address
  406.         subq.b    #1,pp_notecnt
  407.         bne.s    .l5
  408.  
  409. .l0:        addq.l    #2,pp_songptr
  410.         subq.w    #1,pp_songcnt
  411.         bne.s    .l1
  412.  
  413.         move.l    pp_songend,a1
  414.         jsr    (a1)            ; signal songend
  415.  
  416.         move.l    songtable(PC),pp_songptr
  417.         move.w    songlen(PC),pp_songcnt
  418. .l1:        move.l    pp_songptr(PC),a1
  419.         move.w    (a1),d0
  420.         mulu    #pt_sizeof,d0
  421.         add.l    patttable(PC),d0
  422.         move.l    d0,a1
  423.         move.b    pt_size+1(a1),pp_notecnt
  424.         move.l    pt_address(a1),pp_address
  425.  
  426. .l5:        clr.w    pp_tmpdmacon
  427.         lea    pp_variables(PC),a1
  428.         bsr    pp_nnt
  429.         addq.w    #nt_sizeof,a0
  430.         lea    pp_variables+pv_sizeof(PC),a1
  431.         bsr    pp_nnt
  432.         addq.w    #nt_sizeof,a0
  433.         lea    pp_variables+2*pv_sizeof(PC),a1
  434.         bsr    pp_nnt
  435.         addq.w    #nt_sizeof,a0
  436.         lea    pp_variables+3*pv_sizeof(PC),a1
  437.         bsr    pp_nnt
  438.  
  439.         move.w    pp_tmpdmacon(PC),$96(a6)
  440.  
  441.         bsr.s    pp_wait1    ; added by Delirium
  442.  
  443.         lea    pp_variables(PC),a1
  444.         bsr.s    pp_scr
  445.         lea    pp_variables+pv_sizeof(PC),a1
  446.         bsr.s    pp_scr
  447.         lea    pp_variables+2*pv_sizeof(PC),a1
  448.         bsr.s    pp_scr
  449.         lea    pp_variables+3*pv_sizeof(PC),a1
  450.         bsr.s    pp_scr
  451.  
  452.         bset    #7,pp_tmpdmacon
  453.         move.w    pp_tmpdmacon(PC),$96(a6)
  454.  
  455.         bsr.s    pp_wait1    ; added by Delirium
  456.  
  457.         move.l    pp_variables+pv_insaddress(PC),$A0(a6)
  458.         move.w    pp_variables+pv_inslen(PC),$A4(a6)
  459.         move.l    pp_variables+pv_sizeof+pv_insaddress(PC),$B0(a6)
  460.         move.w    pp_variables+pv_sizeof+pv_inslen(PC),$B4(a6)
  461.         move.l    pp_variables+2*pv_sizeof+pv_insaddress(PC),$C0(a6)
  462.         move.w    pp_variables+2*pv_sizeof+pv_inslen(PC),$C4(a6)
  463.         move.l    pp_variables+3*pv_sizeof+pv_insaddress(PC),$D0(a6)
  464.         move.w    pp_variables+3*pv_sizeof+pv_inslen(PC),$D4(a6)
  465.  
  466.         rts
  467.  
  468. pp_wait1:    moveq    #4,d1        ; added by Delirium
  469. pp_wait2:    move.b    $06(a6),d0    ;
  470. pp_wait3:    cmp.b    $06(a6),d0    ;
  471.         beq.s    pp_wait3    ;
  472.         dbf    d1,pp_wait2    ;
  473.         rts            ;
  474.  
  475. pp_scr:        move.w    pp_tmpdmacon(PC),d0
  476.         and.w    pv_dmacon(a1),d0
  477.         beq.s    .l5
  478.  
  479.         move.l    pv_custbase(a1),a0
  480.         move.l    pv_insaddress(a1),(a0)
  481.         move.w    pv_inslen(a1),4(a0)
  482.         move.w    pv_pers(a1),6(a0)
  483.         btst    #0,pv_flags(a1)
  484.         bne.s    .l5
  485.         move.l    #pp_nullwave,pv_insaddress(a1)
  486.         move.w    #1,pv_inslen(a1)
  487.  
  488. .l5:        rts
  489.  
  490. pp_nnt:        move.b    (a0),d1        ;nt_period
  491.         beq    .l5
  492.  
  493.         and.l    #$000000FF,d1
  494.         add.w    d1,d1
  495.         add.l    #pp_periods-2,d1
  496.         move.l    d1,a2
  497.  
  498.         btst    #6,nt_speed(a0)
  499.         beq.s    .l2
  500.         move.w    (a2),pv_porlevel(a1)
  501.         bra.s    .l5
  502.  
  503. .l2:        move.w    pv_dmacon(a1),d0
  504.         or.w    d0,pp_tmpdmacon
  505.  
  506.         move.l    a2,pv_peraddress(a1)
  507.         move.w    (a2),pv_pers(a1)
  508.         move.w    (a2),pv_pers+2(a1)
  509.         move.w    (a2),pv_pers+4(a1)
  510.  
  511.         clr.w    pv_por(a1)
  512.  
  513.         move.b    nt_instr(a0),d0
  514.         ext.w    d0
  515.         mulu    #it_sizeof,d0
  516.         add.l    instable(PC),d0
  517.         move.l    d0,a2
  518.         tst.l    it_address(a2)
  519.         bne.s    .l1
  520.         move.l    #pp_nullwave,pv_insaddress(a1)
  521.         move.w    #1,pv_inslen(a1)
  522.         clr.b    pv_flags(a1)
  523.         bra.s    .l5
  524.  
  525. .l1:        move.l    it_address(a2),a3
  526.         btst    #1,it_flags(a2)
  527.         bne.s    .l0a
  528.         move.l    it_size(a2),d0
  529.         lsr.l    #1,d0
  530.         move.w    d0,pv_inslen(a1)
  531.         bra.s    .l0
  532. .l0a:        move.w    (a1),d0        ;pv_waveoffset
  533.         add.w    d0,a3
  534.         move.w    #$20,pv_inslen(a1)
  535. .l0:        move.l    a3,pv_insaddress(a1)
  536.         move.b    it_flags(a2),pv_flags(a1)
  537.         move.w    pv_vollevel(a1),pv_vol(a1)
  538.  
  539. .l5:        move.b    nt_speed(a0),d0
  540.         and.b    #$0F,d0
  541.         beq.s    .l6
  542.         move.b    d0,pp_wait
  543.  
  544. .l6:        move.l    pv_peraddress(a1),a2
  545.         move.b    nt_arpeggio(a0),d0
  546.         beq.s    .l9
  547.         cmp.b    #$FF,d0
  548.         bne.s    .l7
  549.         move.w    (a2),pv_pers(a1)
  550.         move.w    (a2),pv_pers+2(a1)
  551.         move.w    (a2),pv_pers+4(a1)
  552.         bra.s    .l9
  553.  
  554. .l7:        and.b    #$0F,d0
  555.         add.b    d0,d0
  556.         ext.w    d0
  557.         move.w    (a2,d0.w),pv_pers+4(a1)
  558.         move.b    nt_arpeggio(a0),d0
  559.         lsr.b    #4,d0
  560.         add.b    d0,d0
  561.         ext.w    d0
  562.         move.w    (a2,d0.w),pv_pers+2(a1)
  563.         move.w    (a2),pv_pers(a1)
  564.  
  565. .l9:        move.b    nt_vibrato(a0),d0
  566.         beq.s    .ld
  567.         cmp.b    #$FF,d0
  568.         bne.s    .la
  569.         clr.l    pv_vib(a1)
  570.         clr.b    pv_vibcnt(a1)
  571.         bra.s    .ld
  572. .la:        clr.w    pv_vib(a1)
  573.         and.b    #$0F,d0
  574.         ext.w    d0
  575.         move.w    d0,pv_deltavib(a1)
  576.         move.b    nt_vibrato(a0),d0
  577.         lsr.b    #4,d0
  578.         move.b    d0,pv_vibmax(a1)
  579.         lsr.b    #1,d0
  580.         move.b    d0,pv_vibcnt(a1)
  581.  
  582. .ld:        move.b    nt_phase(a0),d0
  583.         beq.s    .l10
  584.         cmp.b    #$FF,d0
  585.         bne.s    .le
  586.         clr.w    pv_phase(a1)
  587.         move.w    #$FFFF,pv_deltaphase(a1)
  588.         bra.s    .l10
  589. .le:        and.b    #$0F,d0
  590.         ext.w    d0
  591.         move.w    d0,pv_deltaphase(a1)
  592.         clr.w    pv_phase(a1)
  593.  
  594. .l10:        move.b    nt_volume(a0),d0
  595.         bne.s    .l10a
  596.         btst    #7,nt_speed(a0)
  597.         beq.s    .l16
  598.         bra.s    .l11a
  599. .l10a:        cmp.b    #$FF,d0
  600.         bne.s    .l11
  601.         clr.w    pv_deltavol(a1)
  602.         bra.s    .l16
  603. .l11:        btst    #7,nt_speed(a0)
  604.         beq.s    .l12
  605. .l11a:        move.b    d0,pv_vol+1(a1)
  606.         move.b    d0,pv_vollevel+1(a1)
  607.         clr.w    pv_deltavol(a1)
  608.         bra.s    .l16
  609. .l12:        bclr    #7,d0
  610.         beq.s    .l13
  611.         neg.b    d0
  612. .l13:        ext.w    d0
  613.         move.w    d0,pv_deltavol(a1)
  614.  
  615. .l16:        move.b    nt_porta(a0),d0
  616.         beq.s    .l1a
  617.         cmp.b    #$FF,d0
  618.         bne.s    .l17
  619.         clr.l    pv_por(a1)
  620.         bra.s    .l1a
  621. .l17:        clr.w    pv_por(a1)
  622.         btst    #6,nt_speed(a0)
  623.         beq.s    .l17a
  624.         move.w    pv_porlevel(a1),d1
  625.         cmp.w    pv_pers(a1),d1
  626.         bgt.s    .l17c
  627.         neg.b    d0
  628.         bra.s    .l17c
  629.  
  630. .l17a:        bclr    #7,d0
  631.         bne.s    .l18
  632.         neg.b    d0
  633.         move.w    #135,pv_porlevel(a1)
  634.         bra.s    .l17c
  635.  
  636. .l18:        move.w    #1019,pv_porlevel(a1)
  637. .l17c:        ext.w    d0
  638. .l18a:        move.w    d0,pv_deltapor(a1)
  639.  
  640. .l1a:        rts
  641.  
  642.     *** Data section ***
  643.  
  644. pp_periods:    DC.W    1019,962,908,857,809,763,720,680,642,606,572,540
  645.         DC.W    509,481,454,428,404,381,360,340,321,303,286,270
  646.         DC.W    254,240,227,214,202,190,180,170,160,151,143,135
  647.         DC.W    135,135,135,135,135,135,135,135,135
  648.         DC.W    135,135,135,135,135,135
  649.  
  650. songlen:    DS.W    1
  651. songtable:    DS.L    1
  652. instable:    DS.L    1
  653. patttable:    DS.L    1
  654.  
  655. pp_wait:    DS.B    1
  656. pp_waitcnt:    DS.B    1
  657. pp_notecnt:    DS.B    1
  658. pp_address:    DS.L    1
  659. pp_songptr:    DS.L    1
  660. pp_songcnt:    DS.W    1
  661. pp_pattentry:    DS.L    1
  662. pp_tmpdmacon:    DS.W    1
  663. pp_variables:    DS.B    4*48
  664.  
  665.  
  666.         SECTION    BTLCRACKER_CHIP,DATA_C
  667.  
  668.     *** Chip section ***
  669.  
  670. pp_nullwave:    DS.L    1
  671.  
  672.